package com.sunny.springboot2.core.handler;

import com.sunny.springboot2.core.annotation.DateTime;
import org.apache.commons.lang3.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 日期校验
 * @author sunny
 * @date 2018/11/30
 */
public class DateTimeValidator implements ConstraintValidator<DateTime, String> {

    private DateTime dateTime;

    /**
     * 主要用于初始化，它可以获得当前注解的所有属性
     *
     * @param dateTime
     * @author sunny
     * @date 2018/11/30
     * @return void
     */
    @Override
    public void initialize(DateTime dateTime) {
        this.dateTime = dateTime;
    }

    /**
     * 进行约束验证的主体方法，其中 value 就是验证参数的具体实例，context 代表约束执行的上下文环境。
     *
     * @param value 字符串日期
     * @param context
     * @author sunny
     * @date 2018/11/30
     * @return boolean
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 如果 value 为空则不进行格式验证， 为空验证可以用其他注解控制，职责分离
        if (StringUtils.isBlank(value)) {
            return true;
        }

        String format = dateTime.format();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);

        try {
            LocalDateTime.parse(value, dateTimeFormatter);
        } catch (Exception e) {
            return false;
        }

        return true;
    }
}
